/*
Language: Lua
Author: Andrew Fedorov <dmmdrs@mail.ru>
*/

function(hljs) {
  var OPENING_LONG_BRACKET = '\\[=*\\[';
  var CLOSING_LONG_BRACKET = '\\]=*\\]';
  var LONG_BRACKETS = {
    begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,
    contains: ['self']
  };
  var COMMENTS = [
    {
      className: 'comment',
      begin: '--(?!' + OPENING_LONG_BRACKET + ')', end: '$'
    },
    {
      className: 'comment',
      begin: '--' + OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,
      contains: [LONG_BRACKETS],
      relevance: 10
    }
  ]
  return {
    defaultMode: {
      lexems: hljs.UNDERSCORE_IDENT_RE,
      keywords: {
        keyword:
          'and break do else elseif end false for if in local nil not or repeat return then ' +
          'true until while',
        built_in:
          '_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load ' +
          'loadfile loadstring module next pairs pcall print rawequal rawget rawset require ' +
          'select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug ' +
          'io math os package string table'
      },
      contains: COMMENTS.concat([
        {
          className: 'function',
          beginWithKeyword: true, end: '\\)',
          keywords: 'function',
          contains: [
            {
              className: 'title',
              begin: '([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*'
            },
            {
              className: 'params',
              begin: '\\(', endsWithParent: true,
              contains: COMMENTS
            }
          ].concat(COMMENTS)
        },
        hljs.C_NUMBER_MODE,
        hljs.APOS_STRING_MODE,
        hljs.QUOTE_STRING_MODE,
        {
          className: 'string',
          begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,
          contains: [LONG_BRACKETS],
          relevance: 10
        }
      ])
    }
  };
}
